#pragma once
#ifdef _WIN32
#include "Debuger.h"
#include "CameraCapture.h"
//Windows
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/avutil.h"
#include "libswscale/swscale.h"
#include "libavutil/opt.h"
#include "libavutil/imgutils.h"
};
#include <iostream>
#else
#ifdef __cplusplus
extern "C"
{
#endif
#include "libavutil/opt.h"
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#ifdef __cplusplus
};
#endif
#endif

class VideoCodeObserver {
public:
	virtual void OnGetCodeFrame(uint8_t *data, int len) {
		Debuger::Debug(L"get one code %d \r\n", len);
	}
};

class VideoCoder :  public Camera::CameraObserver{
private:
	int mWidth;
	int mHeight;
	unsigned int mDestWidth;
	unsigned int mDestHeight;
	int mBytePerPixel;
	enum AVPixelFormat mInformat;
	AVFormatContext *mFormatCtx;
	AVOutputFormat *mOutputFmt;
	AVStream *mVideoStream;
	AVCodecContext *mCodecCtx;
	AVCodec *mCodec;
	AVPacket mAVPack;
	uint8_t *mPitureBuffer;
	AVFrame *mFrame;
	VideoCodeObserver *mObserver;

public:
	int OnBuffer(double dblSampleTime, BYTE * pBuffer, long lBufferSize);
	int OnCameraData(uint8_t *dat, uint32_t size) ;
	int SetDestPix(uint8_t width,uint8_t height);
	VideoCoder(int width,int height,AVPixelFormat formt);
	~VideoCoder();
	void Encode(uint8_t*src,int size, enum AVPixelFormat format);
	void SetOberver(VideoCodeObserver *p) {
		this->mObserver = p;
	}
	void SetOutPutPixel(unsigned int width,unsigned int height);
private:
	int flushCoder(AVFormatContext *fmt_ctx, unsigned int stream_index);
	int forceYUV420P(uint8_t *src, int size, enum AVPixelFormat format, uint8_t ***dst,int *s);

};

